package cn.bugstack.chatglm.interceptor;

import cn.bugstack.chatglm.session.Configuration;
import cn.bugstack.chatglm.utils.BearerTokenUtils;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;

/**
 * @description 接口拦截器，实现了okhttp3框架提供的Interceptor
 * 用于拦截所有通过OkHttpClient发送的HTTP请求，在请求到达服务器之前，修改请求的Header并进行必要的处理
 */
public class OpenAiHTTPInterceptor implements Interceptor {

    /**
     * 用于后面获取api key做身份验证
     */
    private final Configuration configuration;

    public OpenAiHTTPInterceptor(Configuration configuration) {
        this.configuration = configuration;
    }

    /**
     * 实现拦截逻辑，intercept(Chain chain) 方法是 Interceptor 接口的核心方法。
     * @param chain，请求链，可以获取请求信息并继续处理
     * @return
     * @throws IOException
     */
    @Override
    public @NotNull Response intercept(Chain chain) throws IOException {
        // 1. 获取原始 Request，原始的HTTP请求
        Request original = chain.request();
        // 2. 构建请求
        Request request = original.newBuilder()
                .url(original.url())
                .header("Authorization", "Bearer " + BearerTokenUtils.getToken(configuration.getApiKey(), configuration.getApiSecret()))//API访问令牌，智谱的模型在鉴权认证放main与gpt不一致，需要根据自己的API key生成token，用token鉴权
                .header("Content-Type", Configuration.JSON_CONTENT_TYPE)//服务器回应时，告诉客户端本次回应数据的格式
                .header("User-Agent", Configuration.DEFAULT_USER_AGENT)//标识请求来源，比如SDK版本，客户端信息等
//                .header("Accept", null != original.header("Accept") ? original.header("Accept") : Configuration.SSE_CONTENT_TYPE)
                .method(original.method(), original.body())//保留原始的请求方法以及请求体
                .build();

        // 3. 返回执行结果
        return chain.proceed(request);
    }

}
